home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / —‹Œêsrc.lzh / xf.c < prev    next >
C/C++ Source or Header  |  1993-03-19  |  50KB  |  2,340 lines

  1. #include    "3DDEF.H"
  2. #include    "GLOBAL.H"
  3. #include    "FORWARD.H"
  4. #include    "XCODE.H"
  5. #include    "FORWARD2.H"
  6.  
  7. extern int kigou_or_code;
  8. extern UBYTE handakuten_list[];
  9. extern UBYTE dakuten_list[];
  10. extern UBYTE left[MAXLINE],right[MAXLINE],right_r[MAXLINE];
  11. extern int leftc,rightc;
  12.  
  13. extern UWORD CRX,CRY;
  14. extern UWORD view_flag;
  15.  
  16. extern WORD VERSION;
  17.  
  18. WORD UNDER_FLAG;
  19.  
  20. int XF3_RUN;
  21. UBYTE koho_10[10+1][MAXLINE];
  22. UWORD koho_10x[10+1];
  23. UWORD koho_max;
  24.  
  25. UBYTE f7_buff[32];
  26. UBYTE ledpat;
  27.  
  28. UWORD CXF1_FLAG = 1;
  29.  
  30. UWORD TBCP0 = 0;
  31. UWORD LAST_TR = 0;
  32. UWORD LAST_TR0 =0,TBUFFC_R0 = 0;
  33.  
  34. /* リターンすべきかどうかのフラグを返す */
  35. int
  36. xf_check(UINT c)
  37. {
  38.     UINT x,y;
  39.  
  40.     if (c < 0x100) {
  41.         return(0);
  42.     }
  43. /*etc_beep();*/
  44.  
  45.     /* 変換バッファが空の場合を先にチェック */
  46.     switch(c) {
  47.     case 0x101:
  48.     case 0x111:    /* SHIFTL_XF1:変換モードに入る/抜ける */
  49.     if (DUM_FLAG) return(1);
  50.     if (FP_MODE[3] == 'H') {    /* 変換モードであった */
  51.         xf_ikinari_kakutei();
  52.         fep_hmode_set((UBYTE)'M');
  53.     } else {
  54.         fep_hmode_set((UBYTE)'H');
  55.     }
  56.     disp_hmode();        /* 一番下の行に変換モード表示を行う */
  57.     etc_while_fep_qxf();    /* 離されるまで待つ */
  58.     return(1);
  59.  
  60.     case 0x121:        /* 変換モードと半角無変換ANKをトグルする */
  61.     if (DUM_FLAG) {
  62.         return(1);
  63.     }
  64.     xf_do_121();
  65.     return(1);
  66.     break;
  67.  
  68.     case 0x108:        /* 記号入力開始 */
  69.     xf_ikinari_kakutei();
  70.     etc_func_off();
  71.     kigou_or_code = 1;
  72.     return(1);
  73.  
  74.     case 0x10c:    /* コード入力開始 */
  75.     xf_ikinari_kakutei();
  76.     etc_func_off();
  77.     FNCKEYGT(7,f7_buff);
  78.     FNCKEYST(7,"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
  79.     etc_while_fep_qxf();    /* 離されるまで待つ */
  80.     kigou_or_code = 2;
  81.     return(1);
  82.  
  83.     case 0x107:    /* 登録開始 */
  84.     if (!UNDER_FLAG) {
  85.         xf_touroku();
  86.     }
  87.     return(1);
  88.  
  89.     case 0x117:
  90.     case 0x127:    /* 削除開始 */
  91.     if (!UNDER_FLAG) {
  92.         xf_sakujyo();
  93.     }
  94.     return(1);
  95.  
  96.     case 0x10f:    /* 全角 */
  97.     xf_toggle_fp_mode(0);    /* 全角をトグルする */
  98.     etc_while_fep_qxf();    /* 離されるまで待つ */
  99.     return(1);
  100.  
  101.     case 0x109:    /* ひらがな */
  102.     break;
  103.     xf_toggle_fp_mode(1);
  104.     etc_while_fep_qxf();    /* 離されるまで待つ */
  105.     return(1);
  106.  
  107.     case 0x10d:    /* ローマ字 */
  108.     if ((FP_MODE[1] == (UBYTE)'K') && (FP_MODE[2] != 'R')) {
  109.         xf_toggle_fp_mode(1);
  110.     }
  111.     xf_toggle_fp_mode(2);
  112.     etc_while_fep_qxf();    /* 離されるまで待つ */
  113.     return(1);
  114.  
  115.     case 0x10e:    /* かな */
  116.     if ((FP_MODE[1] != (UBYTE)'K') && (FP_MODE[2] == 'R')) {
  117.         xf_toggle_fp_mode(2);
  118.     }
  119.     xf_toggle_fp_mode(1);
  120.     etc_while_fep_qxf();    /* 離されるまで待つ */
  121.     return(1);
  122.  
  123.     case 0x10b:    /* CAPS */
  124.     etc_while_fep_qxf();    /* 離されるまで待つ */
  125.     return(1);
  126.  
  127.     case 0x102:    /* XF2 */
  128.     LEDMOD(3,!(K_SFTSNS() & 0b00010000000));
  129.     etc_while_fep_qxf();    /* 離されるまで待つ */
  130.     return(1);
  131.  
  132. #if 0
  133.     case 0x228:    /* CTRL-F8 :辞書名変更 */
  134.     if (DUM_FLAG) return(1);
  135. /*    xf_dic_flush();*/
  136.     xf_dic_change();
  137.     etc_while_fep_qxf();    /* 離されるまで待つ */
  138.     return(1);
  139. #endif
  140.  
  141.     case 0x229:    /* CTRL-F9 :学習モード変更 */
  142.     if (DUM_FLAG) return(1);
  143.     ctrl_t_dm();
  144.     return(1);
  145.  
  146. /*
  147. UWORD TBCP0 = 0;
  148. UWORD LAST_TR = 0;
  149. UWORD LAST_TR0 =0,TBUFFC_R0 = 0;
  150. */
  151.     case 0x1ff:
  152.     if (view_flag) {
  153.         return(1);
  154.     }
  155.     if (!UNDER_FLAG && TL1) {
  156.         if ((FP_MODE[2] == 'R') && !TBUFFC_R) {
  157.             if ((TBCP0 == TBCP) && (LAST_TR0 == LAST_TR)
  158.              && (TBUFFC_R0 == TBUFFC_R)) {
  159.                 xf_disp_insert(&TX,&TY);
  160.             } else {
  161.                 TBCP0 = TBCP;
  162.                 LAST_TR0 = LAST_TR;
  163.                  TBUFFC_R0 = TBUFFC_R;
  164.             }
  165.  
  166.         } else {
  167.             xf_disp_insert(&TX,&TY);
  168.         }
  169.     }
  170.     return(1);
  171.  
  172.     default:
  173.     break;
  174.     }
  175.     return(0);
  176. }
  177.  
  178. UWORD fep_xf_bind_table[MAX_XF];
  179. /*UWORD fep_key_bind_table[MAX_XF];*/
  180.  
  181. void
  182. xf(int c)
  183. {
  184.     UINT c0;
  185.     register int i;
  186.     int flag;
  187.     STR p;
  188.     UBYTE TB[TBUFF_SIZE];
  189.  
  190.     if (xf_check(c)) {
  191.         return;
  192.     }
  193.  
  194.     if (!TBUFFC && !TBUFFC_R) {
  195.         return;    /* 変換バッファが空なら何もしない */
  196.     }
  197.  
  198.     for(i=0;i<SEG_MAX;i++) {
  199.         SEG_FLAG[i] = 0;
  200.     }
  201.     line_seigyou();
  202.  
  203.     switch(c) {
  204.     case 0x103:    /* 変換開始 */
  205.     xf_flush_tb_r();
  206.     XF3_RUN = 0;
  207.     strcpy(TBUFF_R,&TBUFF[TBCP]);
  208.     TBUFF[TBCP] = EOS;
  209.     kcount = KNJCTRL(19,TBUFF,kc,k1);    /* 19=変換開始 */
  210.     fnumber = 0;    /* 文節番号 */
  211.     SEG[fnumber][0] = EOS;
  212.     knumber = 1;    /* 候補番号 */
  213.     bnumber = 0;    /* ブロック番号 */
  214.     if (xf_disp(fnumber,kc,k1)) {
  215.         return;
  216.     }
  217.     do {
  218.         c0 = fep_INKEY_wait();
  219.         if (c0 == L' ') {
  220.             c0 = ' ';
  221.         } else {
  222.             if (SP_XFER && (c0 == 0x1ff) && !TBUFFC_R) {
  223.                 c0 = ' ';
  224.             }
  225.         }
  226.         if (c0 < MAX_XF) {    /* 変換中のキーバインド変更 */
  227.             if (!(c0 = fep_xf_bind_table[c0])) {
  228.                 continue;    /* 0に引っ掛かった */
  229.             }
  230.         }
  231.         flag = xf0(c0);
  232.     } while(!flag);
  233.     if (flag <= 1) {
  234.         disp_half_flush(TL0,TY0);
  235.     } else {
  236.         return;
  237.     }
  238.     break;
  239.  
  240.     case 0x104:    /* かな/カナ変換 */
  241.             /* RAW color のまま変換する */
  242.             /* かなに戻せばかな漢字変換可能 */
  243.     TBCP += TBUFFC_R;
  244.     TBUFFC += TBUFFC_R;
  245.     xf_cat_r_init(TBUFF,TBUFF_R);
  246.     p = TBUFF;
  247.     while(1) {
  248.         p = etc_jfirst_x(p,&c0);
  249.         if (!p) return;    /* かな/カナが見付からなかった */
  250.         if ((c0 >= L'ヴ') && (c0 <= L'ヶ')) {
  251.             p += 2;
  252.             continue;
  253.         }
  254.         if (etc_jiskata(c0)) {
  255.             etc_zen_kata_to_hira(TBUFF,TBUFF,TBUFF_SIZE);
  256.             TBCP = TBUFFC = strlen(TBUFF);
  257.             break;
  258.         } else if (etc_jishira(c0)) {
  259.             etc_zen_hira_to_kata(TBUFF,TBUFF,TBUFF_SIZE);
  260.             TBCP = TBUFFC = strlen(TBUFF);
  261.             break;
  262.         }
  263.         /* 続行 */
  264.     }
  265.     if (xf_disp_insert(&TX,&TY)) {
  266.         return;
  267.     }
  268.     work_cursor_cpx();
  269.     etc_while_fep_qxf();    /* 離されるまで待つ */
  270.     break;
  271.  
  272.     case 0x105:    /* いきなり全文確定 */
  273.     xf_ikinari_kakutei();
  274.     break;
  275.  
  276.     case 0x122:    /* CTRL+XF2 左側を確定 */
  277.     break;
  278.  
  279.     case 0x124:    /* CTRL+XF4 ルビにする */
  280.     xf_cat_r_init(TBUFF,TBUFF_R);
  281.     strcpy(TB,TBUFF);
  282.     ctrl_ubar();
  283. /*    CY = window_is_this_line_in_current(CL);*/
  284.     if ((CL->ATO == TAIL) && !line_length(CL)) {
  285.         break;
  286.     }
  287. /*    break;*/
  288.     xf_rubi(TB);
  289.     xf_init_tb();
  290.     etc_trim_tail();
  291.     break;
  292.  
  293.     case 0x114:    /* SHIFT+XF4 全角/半角変換 */
  294.             /* RAW color のまま変換する */
  295.     xf_cat_r_init(TBUFF,TBUFF_R);
  296.     p = TBUFF;
  297.     while(1) {
  298.         p = etc_jfirst_x(p,&c0);    /* c0 = 最初の文字 */
  299.         if (!p) {
  300.             return;    /* かな/カナが見付からなかった */
  301.         }
  302.         if (0x839f <= c0) {    /* 漢字 */
  303.             continue;
  304.         }
  305.         if ((c0 > 0x100) && ((c0 & 0xff00) != 0x8000)) {    /* 全角ってことで */
  306.             etc_str_zen_to_han(TBUFF,TBUFF,TBUFF_SIZE);
  307.             TBCP = TBUFFC = strlen(TBUFF);
  308.             break;
  309.         } else {
  310.             etc_str_han_to_zen(TBUFF,TBUFF,TBUFF_SIZE);
  311.             TBCP = TBUFFC = strlen(TBUFF);
  312.             break;
  313.         }
  314.         /* 続行 */
  315.     }
  316.     xf_disp_insert(&TX,&TY);
  317.     work_cursor_cpx();
  318.     etc_while_fep_qxf();    /* 離されるまで待つ */
  319.     break;
  320.     }
  321. }
  322.  
  323. void
  324. xf_ikinari_kakutei()
  325. {
  326.     etc_color(NORMAL);
  327.     if (UNDER_FLAG) {
  328.         fep_under_ikinari_kakutei();
  329.     } else if (TBUFFC || TBUFFC_R) {
  330.         TBCP += TBUFFC_R;
  331.         TBUFFC += TBUFFC_R;
  332. /*window0();printf("(%s)(%s)",TBUFF,TBUFF_R);binkey();*/
  333.         xf_cat_r_init(TBUFF,TBUFF_R);
  334.         work_replace_str_echo(TL0,TBP0,TL1,TBP1,TBUFF,TBCP,TY0);
  335.         xf_init_tb();
  336.         disp_half_flush(CL,CY);
  337. /*        disp_half_flush(TL0,TY0);*/
  338.         under_blanc();
  339.     }
  340.     etc_trim_tail();
  341. }
  342.  
  343. /* 変換開始 */
  344. int
  345. xf0(int c)
  346. {
  347.     register int i;
  348.     int w;
  349.     short ws;
  350.     UBYTE kc0[TBUFF_SIZE];
  351.     int knumber0;
  352.     int kohox;
  353.     UBYTE tlast[MAXLINE];
  354.  
  355.     switch(c) {
  356.  
  357.     case 0x101:        /* XF1:前文節へ */
  358.     if (fnumber > 0) {
  359.         strcpy(SEG[fnumber],kc);
  360.         KNJCTRL(25,knumber,kc0,kc,k1,&ws);    /* 一旦文節を確定する */
  361.         etc_func_on();            /* 数字選択状態から脱出 */
  362.         XF3_RUN = 0;
  363.         kcount = KNJCTRL(35,kc,k1);    /* 35=前文節への移動 */
  364.         kcount = KNJCTRL(35,kc,k1);    /* 35=前文節への移動 */
  365.         fnumber--;
  366.         knumber = 1;    /* 候補番号 */
  367.         bnumber = 0;    /* ブロック番号 */
  368.         if (xf_disp(fnumber,kc,k1)) {
  369.             return(-1);
  370.         }
  371.     }
  372.     break;
  373.  
  374.     case L'1':
  375.     case L'2':
  376.     case L'3':
  377.     case L'4':
  378.     case L'5':
  379.     case L'6':
  380.     case L'7':
  381.     case L'8':
  382.     case L'9':
  383.     if (XF3_RUN < 2) {    /* 数値選択状態でなかった */
  384.         goto else_kakutei;    /* その数値を入力して確定 */
  385.     }
  386.     c = zentohan(c);    /* 数値選択をして次候補 */
  387.  
  388.     case '1':
  389.     case '2':
  390.     case '3':
  391.     case '4':
  392.     case '5':
  393.     case '6':
  394.     case '7':
  395.     case '8':
  396.     case '9':    /* 数値選択をして次候補 */
  397.     knumber = c -'0';
  398.     if ((knumber < koho_max) && (XF3_RUN >= 2)) {
  399.         strcpy(kc,koho_10[knumber]);
  400.         /* break しない */
  401.     } else {
  402.         etc_beep();
  403.         break;
  404.     }
  405.  
  406.     case 0x102:        /* 次文節へ */
  407.     strcpy(SEG[fnumber],kc);
  408.     etc_func_on();
  409.     if (w = KNJCTRL(25,knumber,kc0,kc,k1,&ws)) {
  410.         if (kcount = ws) {
  411.             fnumber++;
  412.             knumber = 1;    /* 候補番号 */
  413.             bnumber = 0;    /* ブロック番号 */
  414.             XF3_RUN = 0;
  415.             if (xf_disp(fnumber,kc,k1)) {
  416.                 return(-1);
  417.             }
  418.         } else {    /* 次の候補がない=最後の文節である */
  419.             strcpy(kc,SEG[fnumber]);
  420.             kcount = KNJCTRL(35,kc,k1);    /* 35=前文節への移動 */
  421.             if (xf_disp(fnumber,kc,k1)) {
  422.                 return(-1);
  423.             }
  424.             XF3_RUN = 0;
  425.             break;
  426. /*            goto kakutei;*/
  427.         }
  428.     } else {
  429. /*        etc_func_on0();*/
  430.         etc_beep();
  431.     }
  432.     break;
  433.  
  434.     case 0x113:
  435.     case FEP_LEFTARROW_CODE:
  436. maekoho:
  437.     /* 数字選択状態にして左候補へ */
  438.     if (XF3_RUN >= 2) {    /* すでに数字選択状態だった */
  439.         if (knumber > 1) {    /* 前候補ブロックに行かなくてもよい */
  440.             knumber0 = knumber--;
  441.             kohox = koho_10x[knumber];
  442.             if (disp_koho(knumber,knumber,&kohox,koho_10[knumber])) {
  443.                 /* 表示しきれない */
  444.             }
  445.             if (disp_koho(knumber0,knumber,&kohox,koho_10[knumber0])) {
  446.                 /* 表示しきれない */
  447.             }
  448.         } else {        /* 前候補ブロックへ行く */
  449.             if (bnumber) {    /* 前ブロックがあるはず */
  450.                 bnumber--;
  451.                 knumber = 9;
  452.                 goto maeblock;    /* 前候補ブロックへ */
  453.             }
  454.         }
  455.     } else {        /* まだ数字選択状態ではない */
  456.         knumber0 = knumber;
  457.         if (knumber > 1) {
  458.             knumber--;
  459.         }
  460.         XF3_RUN = 5;    /* フラグみたいなもの */
  461.         etc_func_off();    /* ファンクションキーの表示を消す */
  462.         while(knumber0 != 1) {    /* 戻る */
  463.             knumber0--;
  464.             w = KNJCTRL(20,kc,k1);    /* 20=候補群ブロック内の前候補を得る */
  465.         }
  466.         strcpy(koho_10[1],kc);    /* 最初は1 */
  467.         knumber0 = 2;
  468.         while(1) {
  469.             if (KNJCTRL(21,kc,k1)) {
  470.                 strcpy(koho_10[knumber0++],kc);
  471.             } else {
  472.                 koho_10[knumber0][0] = EOS;
  473.                 koho_max = knumber0;
  474.                 break;
  475.             }
  476.         }
  477.         disp_koho_block(knumber);
  478.     }
  479.     strcpy(kc,koho_10[knumber]);
  480.     if (xf_disp(fnumber,kc,k1)) {
  481.         return(-1);
  482.     }
  483.     break;
  484.  
  485.     case ' ':
  486.     case 0x103:        /* 次候補:XF0 だから */
  487.     case FEP_RIGHTARROW_CODE:
  488. migikoho:
  489.     switch (XF3_RUN) {
  490.     case 0:
  491.     /* 通常次候補 */
  492.     /* 無条件に第一ブロック */
  493.     XF3_RUN++;
  494.     if (KNJCTRL(21,kc,k1)) {    /* 21=候補群ブロック内の次候補を得る */
  495.             /* すんなり見付かった */
  496.         knumber++;
  497.         if (xf_disp(fnumber,kc,k1)) {
  498.             return(-1);
  499.         }
  500.         break;
  501.     }
  502.     /* あるだけで、数値選択モード突入 */
  503.     /* 尻抜け */
  504.  
  505.     case 1:
  506.     /* 数値選択状態突入 */
  507.     etc_func_off();    /* ファンクションキーの表示を消す */
  508.     knumber0 = knumber;
  509.     while(knumber0 != 1) {    /* 戻る */
  510.         knumber0--;
  511.         w = KNJCTRL(20,kc,k1);    /* 20=候補群ブロック内の前候補を得る */
  512.     }
  513.     knumber++;
  514.     strcpy(koho_10[1],kc);    /* 最初は1 */
  515.     knumber0 = 2;
  516.     while(1) {
  517.         if (KNJCTRL(21,kc,k1)) {
  518.             strcpy(koho_10[knumber0++],kc);
  519.         } else {
  520.             koho_10[knumber0][0] = EOS;
  521.             koho_max = knumber0;
  522.             break;
  523.         }
  524.     }
  525.     if (!*koho_10[knumber]) {    /* 数字選択状態突入と同時に候補が無ければ */
  526.                     /* 2つの候補だけ表示する */
  527.         knumber = 1;
  528.     }
  529.     disp_koho_block(knumber);
  530.     strcpy(kc,koho_10[knumber]);
  531.     if (xf_disp(fnumber,kc,k1)) {
  532.         return(-1);
  533.     }
  534.     XF3_RUN++;
  535.     break;
  536.  
  537.     case 2:
  538.     default:
  539.     /* 数字選択状態継続 */
  540.     knumber0 = knumber++;
  541.     if (*koho_10[knumber]) {    /* ある */
  542.         kohox = koho_10x[knumber0];
  543.         if (disp_koho(knumber0,knumber,&kohox,koho_10[knumber0])) {
  544.             /* 表示しきれない */
  545.         }
  546. /*        kohox = koho_10x[knumber];*/
  547.         if (disp_koho(knumber,knumber,&kohox,koho_10[knumber])) {
  548.                 /* 表示しきれない */
  549.         }
  550.         strcpy(kc,koho_10[knumber]);
  551.         if (xf_disp(fnumber,kc,k1)) {
  552.             return(-1);
  553.         }
  554.     } else {            /* もうない */
  555.         if (KNJCTRL(23,kc,k1)) {    /* 次候補ブロックの作成 */
  556.                 /* あった */
  557.             bnumber++;
  558.         } else {    /* 無かった */
  559.             while(KNJCTRL(22,kc,k1));    /* 前候補ブロックの作成 */
  560.                             /* 最初まで遡る */
  561.             bnumber = 0;
  562.         }
  563.         knumber = 1;
  564.         strcpy(koho_10[1],kc);    /* 最初は1 */
  565.         knumber0 = 2;
  566.         while(1) {
  567.             if (KNJCTRL(21,kc,k1)) {
  568.                 strcpy(koho_10[knumber0++],kc);
  569.             } else {
  570.                 koho_10[knumber0][0] = EOS;
  571.                 koho_max = knumber0;
  572.                 break;
  573.             }
  574.         }
  575.         if (!*koho_10[knumber]) {
  576.             knumber = 1;
  577.         }
  578.         disp_koho_block(knumber);
  579.         strcpy(kc,koho_10[knumber]);
  580.         if (xf_disp(fnumber,kc,k1)) {
  581.             return(-1);
  582.         }
  583.     }
  584.     break;
  585.     }
  586.     break;
  587.  
  588.     case 0x104:    /* ひらがな/カタカナ変換 */
  589. /* 最初はとにかく「ひらがな」へ */
  590. /* その後はトグル */
  591.     if (etc_is_there_han2byte(kc)) {
  592.         etc_beep();
  593.         under_print("現在の状態ではひらがな⇔カタカナ変換はできません");
  594.         break;
  595.     }
  596.     if (SEG_FLAG[fnumber]) {
  597.         w = KNJCTRL(37,kc,k1);    /* 37=先頭文節をカタカナにする */
  598.         SEG_FLAG[fnumber] = 0;
  599.     } else {
  600.         w = KNJCTRL(38,kc,k1);    /* 38=先頭文節をひらがなにする */
  601.         SEG_FLAG[fnumber] = 1;
  602.     }
  603.     XF3_RUN = 0;
  604.     etc_func_on();
  605.     if (xf_disp(fnumber,kc,k1)) {
  606.         return(-1);
  607.     }
  608.     etc_while_fep_qxf();    /* 離されるまで待つ */
  609.     break;
  610.  
  611.     case 0x114:    /* 半角/全角変換 */
  612. /* 最初はとにかく「半角」へ */
  613. /* その後はトグル */
  614.     w = KNJCTRL(37,kc,k1);    /* 37=先頭文節をカタカナにする */
  615.     if (SEG_FLAG[fnumber]) {
  616.         etc_str_han_to_zen(kc,kc,MAXLINE);    /* 先頭文節を全角にする */
  617.         SEG_FLAG[fnumber] = 0;
  618.     } else {
  619.         etc_str_zen_to_han(kc,kc,MAXLINE);    /* 先頭文節を半角にする */
  620.         SEG_FLAG[fnumber] = 1;
  621.     }
  622.     XF3_RUN = 0;
  623.     etc_func_on();
  624.     if (xf_disp(fnumber,kc,k1)) {
  625.         return(-1);
  626.     }
  627.     etc_while_fep_qxf();    /* 離されるまで待つ */
  628.     break;
  629.  
  630.     case '_' - '@':        /* 生入力削除 */
  631.     ctrl_ubar();
  632.     return(1);
  633.  
  634.     case TAB:
  635.     case 'M'-'@':
  636.     case CR:
  637.     case 0x105:    /* 全体確定 */
  638. kakutei:
  639.     etc_func_on0();
  640.     if (XF3_RUN >= 2) {    /* 数字選択状態だった */
  641.         UBYTE d1[MAXLINE],d2[MAXLINE];
  642.         w = KNJCTRL(25,knumber,kc,d1,d2,&ws);
  643.     }
  644.     xf_get_last(TLAST_SUM,fnumber,kc,k1);
  645.     w = KNJCTRL(24,tlast);    /* 全体確定 */
  646.     /* 変換後が長すぎる場合の切り詰めを検出できないので tlast はダミー */
  647.     w = strlen(TLAST_SUM);
  648.     strcat(TLAST_SUM,TBUFF_R);
  649.     etc_color(NORMAL);
  650.     work_replace_str_echo(TL0,TBP0,TL1,TBP1,TLAST_SUM,w,TY0);
  651.     xf_init_tb();
  652.     under_blanc();
  653.     etc_while_fep_qxf();    /* 離されるまで待つ */
  654.     return(1);
  655.  
  656.     case 0x111:    /* 文節を短くする */
  657.     etc_func_on();
  658.     w = KNJCTRL(34,kc,k1);    /* 34=先頭文節を1文字短くして再変換 */
  659.     for(i=1;i<=9;i++) {
  660.         *koho_10[i] = EOS;
  661.     }
  662.     XF3_RUN = 0;
  663.     if (xf_disp(fnumber,kc,k1)) {
  664.         return(-1);
  665.     }
  666.     break;
  667.  
  668.     case 0x112:    /* 文節を長くする */
  669.     etc_func_on();
  670.     w = KNJCTRL(33,kc,k1);    /* 33=先頭文節を1文字長くして再変換 */
  671.     for(i=1;i<=9;i++) {
  672.         *koho_10[i] = EOS;
  673.     }
  674.     XF3_RUN = 0;
  675.     if (xf_disp(fnumber,kc,k1)) {
  676.         return(-1);
  677.     }
  678.     break;
  679.  
  680.     case '['-'@':    /* キャンセル */
  681.     etc_func_on();
  682.     if (xf_disp_insert(&TX,&TY)) {
  683.         return(-1);
  684.     }
  685.     etc_while_fep_qxf();    /* 離されるまで待つ */
  686.     return(2);
  687.     break;
  688.  
  689.     case FEP_DEL_CODE:    /* DEL */
  690.     break;
  691.  
  692.     case FEP_HOME_CODE:    /* HOME */
  693.     break;
  694.  
  695.     case FEP_DNARROW_CODE:    /* dn */
  696. xf_next_block:
  697.     if (KNJCTRL(23,kc,k1)) {    /* 次候補ブロックの作成 */
  698.         XF3_RUN = 3;        /* !!! 強制 */
  699.         etc_func_off();
  700.         knumber = 1;
  701.         bnumber++;
  702.         strcpy(koho_10[1],kc);    /* 最初は1 */
  703.         knumber0 = 2;
  704.         while(1) {
  705.             if (KNJCTRL(21,kc,k1)) {
  706.                 strcpy(koho_10[knumber0++],kc);
  707.             } else {
  708.                 koho_10[knumber0][0] = EOS;
  709.                 koho_max = knumber0;
  710.                 break;
  711.             }
  712.         }
  713.         strcpy(kc,koho_10[knumber]);
  714.         disp_koho_block(knumber);
  715.         if (xf_disp(fnumber,kc,k1)) {
  716.             return(-1);
  717.         }
  718.     }
  719.     break;
  720.  
  721.     case FEP_UPARROW_CODE:    /* up */
  722. xf_before_block:
  723.     if (bnumber) {
  724.         knumber = 1;
  725.         bnumber--;
  726. maeblock:
  727.         KNJCTRL(22,kc,k1);    /* 前候補ブロックの作成 */
  728.         strcpy(koho_10[1],kc);    /* 最初は1 */
  729.         knumber0 = 2;
  730.         while(1) {
  731.             if (KNJCTRL(21,kc,k1)) {
  732.                 strcpy(koho_10[knumber0++],kc);
  733.             } else {
  734.                 koho_10[knumber0][0] = EOS;
  735.                 koho_max = knumber0;
  736.                 break;
  737.             }
  738.         }
  739. /*window0();printf("(%d)(%d)",knumber,koho_max);binkey();*/
  740.         knumber = min(knumber,koho_max-1);
  741.         strcpy(kc,koho_10[knumber]);
  742.         disp_koho_block(knumber);
  743.         if (xf_disp(fnumber,kc,k1)) {
  744.             return(-1);
  745.         }
  746.     }
  747.     break;
  748.  
  749.     default:
  750.     if (c == XF_NEXT_BLOCK_KEY) {    /* 次候補ブロックへ */
  751.         goto xf_next_block;
  752.     } else if (c == XF_BEFORE_BLOCK_KEY) {    /* 前候補ブロックへ */
  753.         goto xf_before_block;
  754.     } else if (c == XF_RIGHT_KOHO_KEY) {    /* 右候補へ */
  755.         goto migikoho;
  756.     } else if (c == XF_LEFT_KOHO_KEY) {    /* 左候補へ */
  757.         goto maekoho;
  758.     }
  759.  
  760. else_kakutei:
  761.     /* スペース以外の普通の文字 -> 全体を確定して、プッシュ */
  762.     etc_func_on();
  763.     if (XF3_RUN >= 2) {    /* 数字選択状態だった */
  764.         UBYTE d1[MAXLINE],d2[MAXLINE];
  765.         w = KNJCTRL(25,knumber,kc,d1,d2,&ws);
  766.     }
  767.     xf_get_last(TLAST_SUM,fnumber,kc,k1);
  768.     w = KNJCTRL(24,tlast);    /* 全体確定 */
  769.     w = strlen(TLAST_SUM);
  770.     if (c != 0x1ff) {
  771.         strcat(TLAST_SUM,TBUFF_R);
  772.         etc_color(NORMAL);
  773.         work_replace_str_echo(TL0,TBP0,TL1,TBP1,TLAST_SUM,w,TY0);/* 確定部分を表示 */
  774.         xf_init_tb0();
  775.         TTOPL00 = line_my_top();
  776.         TL00 = TL1 = TL0 = CL;    /* 変換バッファの開始行 */
  777.         CRX = CRY = 0;
  778.         TPX00 = TPX0 = CPX;
  779.         TX00 = TX = TX0 = CX;
  780.         TY00 = TY = TY0 = CY;
  781.         TBP1 = TBP00 = TBP0 = ANALYZE[CPX].BPOS;
  782.         fep_push_key(c);
  783.         etc_while_fep_qxf();    /* 離されるまで待つ */
  784.         return(1);
  785.     } else {    /* 1ff だ */
  786.         etc_color(NORMAL);
  787.         work_replace_str_echo(TL0,TBP0,TL1,TBP1,TLAST_SUM,w,TY0);/* 確定部分を表示 */
  788. /* 完全に挿入 */
  789.         xf_init_tb00();
  790.         TTOPL00 = line_my_top();
  791.         TL00 = TL1 = TL0 = CL;    /* 変換バッファの開始行 */
  792.         CRX = CRY = 0;
  793.         TPX00 = TPX0 = CPX;
  794.         TX00 = TX = TX0 = CX;
  795.         TY00 = TY = TY0 = CY;
  796.         TBP1 = TBP00 = TBP0 = ANALYZE[CPX].BPOS;
  797.         if (xf_disp_insert(&TX,&TY)) {
  798.             return(-1);
  799.         }
  800.         return(2);
  801.     }
  802.     break;
  803.     }
  804.     fep_key_clear();
  805.     etc_while_fep_qxf();    /* 離されるまで待つ */
  806.     return(0);
  807. }
  808.  
  809. /* TL0,TPX0,TX0,TY0,TBP0 */
  810. /* TL1,TPX1,TX1,TY1,TBP1 */
  811. /* の2点に挟まれた間を表示する */
  812. /* fn が現在作業中の文節 */
  813. /* 中断なら非零 */
  814. int
  815. xf_disp(int fn,STR kc,STR k1)
  816. {
  817.     UBYTE first_left[TBUFF_SIZE];
  818.     UBYTE f0[TBUFF_SIZE];
  819.     register int i;
  820.     int upc;    /* スクロールアップしたカウンタ */
  821.     int wTX0,wTY0;
  822.  
  823.     *f0 = EOS;
  824.     for(i=0;i<fn;i++) {
  825.         strcat(f0,SEG[i]);
  826.     }    /* 半確定の文節をひとつにまとめる */
  827.  
  828.     line_get_body(first_left,TL0);
  829.     first_left[TBP0] = EOS;    /* 変換の対象になってない左部分 */
  830.  
  831. /* era_box * 3 が無駄 */
  832.     wTX0 = TX0;
  833.     wTY0 = TY0;
  834.     if (*f0) {
  835.         etc_color(OFUSI);
  836.         upc = disp_out_stop(first_left,&wTX0,&wTY0,f0);
  837.         if (upc) {    /* 画面から出る */
  838.             if ((TY0 -= upc) < 0) {    /* ゲロ */
  839.                 /* 警告して、変換をキャンセルする */
  840.                 TY0 += upc;    /* 戻す */
  841.                 *f0 = EOS;
  842.                 xf_ob();
  843.                 return(1);
  844.             }
  845.         }
  846.     }
  847.     etc_color(CFUSI);
  848.     upc = disp_out_stop(first_left,&wTX0,&wTY0,kc);
  849.     if (upc) {    /* 画面から出る */
  850.         if ((TY0 -= upc) < 0) {
  851.             TY0 += upc;    /* 戻す */
  852.             *kc = EOS;
  853.             xf_ob();
  854.             return(1);
  855.         }
  856.     }
  857.     if (*k1) {
  858.         etc_color(OFUSI);
  859.         upc = disp_out_stop(first_left,&wTX0,&wTY0,k1);
  860.         if (upc) {    /* 画面から出る */
  861.             if ((TY0 -= upc) < 0) {
  862.                 TY0 += upc;    /* 戻す */
  863.                 *k1 = EOS;
  864.                 xf_ob();
  865.                 return(1);
  866.             }
  867.         }
  868.     }
  869.     etc_color(NORMAL);
  870.     upc = disp_out_stop(first_left,&wTX0,&wTY0,TBUFF_R);
  871.     if (upc) {    /* 画面から出る */
  872.         if ((TY0 -= upc) < 0) {
  873.             TY0 += upc;    /* 戻す */
  874.             *TBUFF_R = EOS;
  875.             xf_ob();
  876.             return(1);
  877.         }
  878.     }
  879.  
  880. /*    etc_color(MIZU_EMPH_REV);*/
  881.     disp_trans_half_flush(TL1,TBP1,wTX0,wTY0);
  882.     window_loc(wTX0,wTY0);
  883.     disp_cursor_on();
  884.     etc_while_fep_qxf();    /* 離されるまで待つ */
  885.     return(0);
  886. }
  887.  
  888. void
  889. xf_init_tb0()
  890. {
  891.     xf_init_tb00();
  892.     TBUFFC_R = 0;
  893.     *TBUFF_R = EOS;
  894.     ctrl_ubar();
  895. }
  896.  
  897. void
  898. xf_init_tb00()
  899. {
  900.     TBCP = TBUFFC =    TBUFFC_L = 0;
  901.     *TBUFF = *TBUFF_L = EOS;
  902. }
  903.  
  904. void
  905. xf_init_tb()
  906. {
  907.     xf_init_tb0();
  908.     xf_init_tb_r();
  909. }
  910.  
  911. /*
  912.     if (((c == L'゜') && (jstrchr(handakuten_list,cl)))
  913.     || ((c == L'゛') && (jstrchr(dakuten_list,cl)))) {
  914. */            
  915.  
  916. int
  917. xf_append_tb(UINT c)
  918. {
  919.     STR p;
  920.  
  921.     if (c & 0xff00) {    /* 2バイト文字である */
  922.         register int cl;
  923.  
  924.         if ((c == L'゛') || (c == L'゜')) {
  925.             if (cl = etc_jlast_p(TBUFF,&p)) {
  926.                 if ((c == L'゜') && (jstrchr(handakuten_list,cl))) {
  927.                     cl += 2;
  928.                 } else if ((c == L'゛') && (jstrchr(dakuten_list,cl))) {
  929.                     cl++;
  930.                 } else {
  931.                     goto xf_henna_dakuten;
  932.                 }
  933.                 *p++ = (cl >> 8) & 0xff;
  934.                 *p = cl & 0xff;
  935.                 xf_disp_insert(&TX,&TY);
  936.                 return(0);
  937.             }
  938.         }
  939. xf_henna_dakuten:
  940.         if ((TBUFFC+2) > MAX_TB) {
  941.             xf_init_tb_r00();
  942. /*binkey();*/
  943.             return(1);
  944.         }
  945.         lddr(&TBUFF[TBCP+2],&TBUFF[TBCP],TBUFFC-TBCP);
  946.         TBUFF[TBCP++] = (c >> 8);
  947.         TBUFF[TBCP++] = (c &0xff);
  948.         TBUFFC += 2;
  949.         TBUFF[TBUFFC] = EOS;
  950.     } else {        /* 1バイト文字である */
  951.         if ((TBUFFC+1) > MAX_TB) {
  952.             xf_init_tb_r00();
  953.             return(1);
  954.         }
  955.         lddr(&TBUFF[TBCP+1],&TBUFF[TBCP],TBUFFC-TBCP);
  956.         TBUFF[TBCP++] = c;
  957.         TBUFF[++TBUFFC] = EOS;
  958.     }
  959.     xf_disp_insert(&TX,&TY);
  960.     return(0);
  961. }
  962.  
  963. /* 格納出来る長さかどうかをチェック */
  964. int
  965. xf_set_tb_check(STR s)
  966. {
  967.     register int i;
  968.     register STR p;
  969.     UWORD c;
  970.  
  971.     p = s;
  972.     i = 0;
  973. /*window0();*/
  974.     while(1) {
  975.         p = line_skip_xcode(p);
  976.         if (c = etc_jfirst(p)) {
  977.             if (c & 0xff00) {    /* 2バイト文字である */
  978.                 i += 2;
  979.                 p += 2;
  980.             } else {
  981.                 i++;
  982.                 p++;
  983.             }
  984.             if (i > MAX_TB) {
  985.                 return(1);
  986.             }
  987.         } else {
  988.             break;
  989.         }
  990.     }
  991.     return(0);
  992. }
  993.  
  994. /* 非零ならばフル */
  995. /* TBUFFに s を格納する */
  996. int
  997. xf_set_tb(STR s)
  998. {
  999.     UBYTE w[MAXLINE];
  1000.     register int i;
  1001.     register STR p;
  1002.     UWORD c;
  1003.  
  1004.     p = s;
  1005.     i = 0;
  1006. /*window0();*/
  1007.     while(1) {
  1008.         p = line_skip_xcode(p);
  1009.         if (c = etc_jfirst(p)) {
  1010.             if (c & 0xff00) {    /* 2バイト文字である */
  1011.                 w[i++] = c >> 8;
  1012.                 w[i++] = c & 0xff;
  1013.                 p += 2;
  1014.             } else {
  1015.                 w[i++] = c;
  1016.                 p++;
  1017.             }
  1018. /*            if (i > MAX_TB) {
  1019.                 etc_beep();
  1020.                 under_print("再変換にする対象が長すぎます");
  1021.                 return(1);
  1022.             }
  1023. */
  1024.         } else {
  1025.             break;
  1026.         }
  1027.     }
  1028.     w[i] = EOS;
  1029.     strcpy(TBUFF,w);
  1030.     TBUFFC = TBCP = i;
  1031.     xf_disp_insert(&TX,&TY);
  1032.     return(0);
  1033. }
  1034.  
  1035. /* 非零ならばフル */
  1036. int
  1037. xf_append_tb_check(UINT c)
  1038. {
  1039.     if (c & 0xff00) {    /* 2バイト文字である */
  1040.         return((TBUFFC+2) > MAX_TB);
  1041.     } else {        /* 1バイト文字である */
  1042.         return((TBUFFC+1) > MAX_TB);
  1043.     }
  1044. }
  1045.  
  1046. /* TBCP < TBUFFC である */
  1047. /* TBCP を1つ進める */
  1048. int
  1049. xf_forward_tb()
  1050. {
  1051.     UINT c;
  1052.  
  1053.     if (etc_check_char_kind_1byte(c = TBUFF[TBCP++])-1) {
  1054.         TBCP++;
  1055.     } else {        /* 1バイト文字である */
  1056.     }
  1057.     xf_disp_insert(&TX,&TY);
  1058.     return(0);
  1059. }
  1060.  
  1061. /* TBCP を1文字分戻す */
  1062. /* 戻した文字コードを返す */
  1063. /* 戻さなかったら零 */
  1064. /* BACK */
  1065. UINT
  1066. xf_back_tb()
  1067. {
  1068.     UINT c;
  1069.     
  1070.     if (!TBCP) {
  1071.         return(0);
  1072.     }
  1073.     c = etc_j_n_char(TBUFF,TBCP);
  1074.  
  1075.     if (c & 0xff00) {    /* 2バイト文字である */
  1076.         TBCP -= 2;
  1077.     } else {        /* 1バイト文字である */
  1078.         TBCP--;
  1079.     }
  1080. /*    TBUFF[TBCP] = EOS;*/
  1081.     return(c);
  1082. }
  1083.  
  1084. #if 0
  1085. /* TBUFF_R の位置の1文字を削除する */
  1086. /* 必ず削除する */
  1087. /* BS */
  1088. void
  1089. xf_delete_tb_r()
  1090. {
  1091.     STR p;
  1092.     
  1093.     etc_jlast_p(TBUFF_R,&p);/* 文字列の最後の文字を返す *//* 全角文字にも対応 */
  1094.     *p = EOS;
  1095.     TBUFFC_R = p - TBUFF_R;
  1096. }
  1097. #endif
  1098.  
  1099. /* TBCP の位置の左の1文字を削除する */
  1100. /* 削除した文字コードを返す */
  1101. /* 削除しなかったら零 */
  1102. /* BS */
  1103. UINT
  1104. xf_delete_tb()
  1105. {
  1106.     UINT c;
  1107.     
  1108.     if (!TBCP) {
  1109.         return(0);
  1110.     }
  1111.     c = etc_j_n_char(TBUFF,TBCP);
  1112.  
  1113.     if (c & 0xff00) {    /* 2バイト文字である */
  1114. /*etc_beep();etc_beep();etc_beep();*/
  1115.         strncpy(&TBUFF[TBCP-2],&TBUFF[TBCP],TBUFFC-TBCP);
  1116.         TBUFF[TBUFFC -= 2] = EOS;
  1117.         TBCP -= 2;
  1118.     } else {        /* 1バイト文字である */
  1119.         strncpy(&TBUFF[TBCP-1],&TBUFF[TBCP],TBUFFC-TBCP);
  1120.         TBUFF[--TBUFFC] = EOS;
  1121.         TBCP--;
  1122.     }
  1123.     return(c);
  1124. }
  1125.  
  1126. /* TL0,TPX0,TX0,TY0,TBP0 */
  1127. /* TL1,TPX1,TX1,TY1,TBP1 */
  1128. /* の2点に挟まれた間を表示する */
  1129. /* fn が現在作業中の文節 */
  1130. /* 中断なら非零 */
  1131. int
  1132. xf_disp_insert(int *rx,int *ry)
  1133. {
  1134.     UBYTE first_left[TBUFF_SIZE];
  1135.     UBYTE f0[TBUFF_SIZE];
  1136.     register int i;
  1137.     int upc;    /* スクロールアップしたカウンタ */
  1138.     int wTX0,wTY0;
  1139.     UBYTE stock;
  1140.  
  1141.     line_get_body(first_left,TL0);
  1142.     first_left[TBP0] = EOS;        /* 未変換の対象になってない左部分 */
  1143.  
  1144.     wTX0 = TX0;
  1145.     wTY0 = TY0;
  1146.  
  1147.     etc_color(RAW);
  1148.     stock = TBUFF[TBCP];
  1149.     TBUFF[TBCP] = EOS;    /* 臨時に切る */
  1150. /*    LAST_T = TBCP;*/
  1151.     upc = disp_out_stop(first_left,&wTX0,&wTY0,TBUFF);
  1152.     if (upc) {    /* 画面から出る */
  1153.         if ((TY0 -= upc) < 0) {
  1154.             TY0 += upc;    /* 戻す */
  1155.             *TBUFF = EOS;
  1156.             xf_ob();
  1157.             return(1);
  1158.         }
  1159.     }
  1160.  
  1161.     if ((TBUFFC+2) > MAX_TB) {
  1162.         xf_init_tb_r00();
  1163.     } else {
  1164.         etc_color(MIZU_EMPH_REV);
  1165.         LAST_TR = TBUFFC_R;
  1166.         upc = disp_out_stop(first_left,&wTX0,&wTY0,TBUFF_R);
  1167.         if (upc) {    /* 画面から出る */
  1168.             if ((TY0 -= upc) < 0) {
  1169.                 TY0 += upc;    /* 戻す */
  1170.                 *TBUFF_R = EOS;
  1171.                 xf_ob();
  1172.                 return(1);
  1173.             }
  1174.         }
  1175.     }
  1176.  
  1177.     *rx = wTX0;
  1178.     *ry = wTY0;
  1179.     etc_color(NORMAL);
  1180.     TBUFF[TBCP] = stock;    /* 戻す */
  1181. #if 0
  1182.     upc = disp_out_stop(first_left,&wTX0,&wTY0,&TBUFF[TBCP]);
  1183.     if (upc) {    /* 画面から出る */
  1184.         if ((TY0 -= upc) < 0) {
  1185.             TY0 += upc;    /* 戻す */
  1186.             TBUFF[TBCP] = EOS;
  1187.             xf_ob();
  1188.             return(1);
  1189.         }
  1190.     }
  1191. #endif
  1192.     disp_trans_half_flush(TL1,TBP1,wTX0,wTY0);
  1193.     return(0);
  1194. }
  1195.  
  1196. /* 変換中にウインドウからはみでた */
  1197. void
  1198. xf_ob()
  1199. {
  1200.     etc_color(NORMAL);
  1201.     under_print0((STR)"ウィンドウが狭すぎます。変換するためにはもっと広くして下さい。([Y]で確認)?");
  1202.     while(toupper(fep_inkey_raw()) != 'Y') {
  1203.     }
  1204.     xf_init_tb();
  1205.     ctrl_ubar();
  1206.     work_replace_str_echo(TL0,TBP0,TL1,TBP1,"",0,TY0);
  1207.     under_print((STR)"変換中の文字列は破棄しました");
  1208.     *TBUFF = EOS;TBUFFC = 0;
  1209.     etc_func_on();            /* 数字選択状態から脱出 */
  1210.     disp_top_flush(TTOPL00);
  1211.     CL = TL00;
  1212.     CPX = TPX00;
  1213.     CX = TX00;
  1214.     CY = TY00;
  1215.  
  1216.         xf_ikinari_kakutei();
  1217.  
  1218.     line_cl_cl();
  1219.     work_line_analyze();
  1220.     work_cursor_cpx();
  1221. }
  1222.  
  1223. void
  1224. xf_get_last(STR last,int fn,STR kc,STR k1)
  1225. {
  1226.     register int i;
  1227.  
  1228.     *last = EOS;
  1229.     for(i=0;i<fn;i++) {
  1230.         strcat(last,SEG[i]);
  1231.     }    /* 半確定の文節をひとつにまとめる */
  1232.     strcat(last,kc);
  1233.     strcat(last,k1);
  1234.     strcat(last,&TBUFF[TBCP]);
  1235. }
  1236.  
  1237. /* コード入力 */
  1238. UINT
  1239. xf_code_input()
  1240. {
  1241.     int i;
  1242.     UINT c,c0,code;
  1243.  
  1244.     LEDMOD(2,0);
  1245.     ledpat = B_BPEEK(LEDSTAT);        /* LEDSTAT */
  1246.     fep_mode_set0(FP_MODE_MUHEN_0);        /* 半角、ひらがな、ANK、無変換 */
  1247. #if 0
  1248.     B_BPOKE(LEDSTAT,ledpat | 0b00000100);    /* コード入力LED点灯 */
  1249. #endif
  1250.     kigou_or_code = 0;
  1251.     while(1) {
  1252.         xf_code_input_sub();
  1253.         i = code = 0;
  1254.         while(i<4) {    /* 4桁入力 */
  1255.             window_abs_loc(20+i,UNDER_Y+1);
  1256.             etc_color(MIZU_REV);
  1257.             B_PUTC(' ');
  1258.             etc_color(RAW0);
  1259.             if (UNDER_FLAG) {
  1260.                 fep_input_flush();    /* カーソルをちゃんと戻す */
  1261.             } else {
  1262.                 work_cursor_cpx();
  1263.             }
  1264.             c0 = c = toupper(fep_inkey_raw_not_code());
  1265.             switch(c) {
  1266.                 case 'F':
  1267.                 case 'E':
  1268.                 case 'D':
  1269.                 case 'C':
  1270.                 case 'B':
  1271.                 case 'A':
  1272.                 if (code_input_mode) {    /* 区点モードなのに A-F だった */
  1273.                     etc_beep();
  1274.                     break;
  1275.                 }
  1276.                 c -= 'A'-'0'-10;
  1277.                 case '9':
  1278.                 case '8':
  1279.                 case '7':
  1280.                 case '6':
  1281.                 case '5':
  1282.                 case '4':
  1283.                 case '3':
  1284.                 case '2':
  1285.                 case '1':
  1286.                 case '0':
  1287.                 c -= '0';
  1288.                 window_abs_loc(20+i,UNDER_Y+1);
  1289.                 B_PUTC(c0);    /* エコー */
  1290.                 if (code_input_mode) {
  1291.                     code = code*10+c;
  1292.                 } else {
  1293.                     code = code*16+c;
  1294.                 }
  1295.                 while(fep_get_key());
  1296.                 i++;
  1297.                 break;
  1298.  
  1299.                 case 'H'-'@':
  1300.                 if (i) {
  1301.                     if (code_input_mode) {
  1302.                         code /= 10;
  1303.                     } else {
  1304.                         code /= 16;
  1305.                     }
  1306.                     window_abs_loc(20+i,UNDER_Y+1);
  1307.                     etc_color(RAW0);
  1308.                     B_PUTC(' ');
  1309.                     i--;
  1310.                 }
  1311.                 break;
  1312.  
  1313.                 case '['-'@':
  1314.                 case 0x10c:        /* コード入力 */
  1315.                 FNCKEYST(7,f7_buff);
  1316.                 etc_func_on();
  1317.                 etc_while_fep_qxf();    /* 離されるまで待つ */
  1318.                 B_BPEEK(LEDSTAT,ledpat);    /* 戻す */
  1319.                 LEDMOD(2,0);
  1320. /*                kigou_or_code = 0;    */
  1321.                 fep_mode_set(FP_MODE);
  1322.                 etc_color(NORMAL);
  1323.                 if (UNDER_FLAG) {
  1324.                     fep_input_flush();    /* カーソルをちゃんと戻す */
  1325.                 } else {
  1326.                     work_cursor_cpx();
  1327.                 }
  1328.                 return(0);
  1329.  
  1330.                 case 0x207:        /* F7 : JIS/シフトJIS <-> 区点 */
  1331.                 code_input_mode = !code_input_mode;
  1332.                 i = code = 0;
  1333.                 while(fep_qxf2());
  1334.                 xf_code_input_sub();
  1335.                 fep_key_clear();
  1336.                 continue;
  1337.  
  1338.                 default:        /* 変なコード */
  1339.                 break;
  1340.             }
  1341.         }
  1342.         if (code_input_mode) {    /* 区点コードである */
  1343.             UINT w;
  1344.  
  1345.             if ((101 <= code) && (code <= 9494)) {
  1346.                 w = (code/100) + 0x20;
  1347.                 code = (code % 100) + 0x20;
  1348.                 code |= (w << 8);
  1349.             } else {
  1350.                 etc_beep();
  1351.                 xf_code_input_sub();                
  1352.                 continue;
  1353.             }
  1354.         }
  1355.         if (code < 0x8000) {
  1356.             code = JISSFT(code);
  1357.         }
  1358.         if (etc_normal_jis(code) == code) {
  1359.             kigou_or_code = 2;
  1360.             etc_color(NORMAL);
  1361.             fep_mode_set(FP_MODE);
  1362.             if (UNDER_FLAG) {
  1363.                 fep_input_flush();    /* カーソルをちゃんと戻す */
  1364.             } else {
  1365.                 work_cursor_cpx();
  1366.             }
  1367.             return(code);
  1368.         } else if (etc_is_normal_han(code)) {
  1369.             kigou_or_code = 2;
  1370.             etc_color(NORMAL);
  1371.             fep_mode_set(FP_MODE);
  1372.             if (UNDER_FLAG) {
  1373.                 fep_input_flush();    /* カーソルをちゃんと戻す */
  1374.             } else {
  1375.                 work_cursor_cpx();
  1376.             }
  1377.             return(code);
  1378.         }
  1379.     }
  1380. }
  1381.  
  1382. void
  1383. xf_code_input_sub()
  1384. {
  1385.     window_abs_loc(0,UNDER_Y+1);
  1386.     B_PRINT("\x1b[0K");    /* カーソルから右をクリア */
  1387.     etc_color(RAW0);
  1388.     if (code_input_mode) {
  1389.         B_PRINT(" [区点]      CODE : ");
  1390.     } else {
  1391.         B_PRINT(" [JIS,SHIFT] CODE : ");
  1392.     }
  1393. }
  1394.  
  1395. void
  1396. xf_toggle_fp_mode(int i)
  1397. {
  1398.     if (FP_MODE[i] == "ZKRM"[i]) {
  1399.         FP_MODE[i] = (UBYTE)"H--H"[i];
  1400.     } else {
  1401.         FP_MODE[i] = (UBYTE)"ZKRM"[i];
  1402.     }
  1403.     disp_hmode();
  1404. }
  1405.  
  1406. #define    kigou_max_block    50
  1407.  
  1408. UINT block_top[kigou_max_block][2] = {
  1409. 0x8000,0x80FF,
  1410. 0x8140,0x81FF,
  1411. 0x8240,0x82FF,
  1412. 0x8340,0x83FF,
  1413. 0x8440,0x84FF,
  1414. 0x889F,0x889F,    /* (1文字のみ) */
  1415. 0x88A0,0x88FF,
  1416. 0x8940,0x89FF,
  1417. 0x8A40,0x8AFF,
  1418. 0x8B40,0x8BFF,
  1419.  
  1420. 0x8C40,0x8CFF,
  1421. 0x8D40,0x8DFF,
  1422. 0x8E40,0x8EFF,
  1423. 0x8F40,0x8FFF,
  1424. 0x9040,0x90FF,
  1425. 0x9140,0x91FF,
  1426. 0x9240,0x92FF,
  1427. 0x9340,0x93FF,
  1428. 0x9440,0x94FF,
  1429. 0x9540,0x95FF,
  1430.  
  1431. 0x9640,0x96FF,
  1432. 0x9740,0x97FF,
  1433. 0x9840,0x98FF,
  1434. 0x9940,0x99FF,
  1435. 0x9A40,0x9AFF,
  1436. 0x9B40,0x9BFF,
  1437. 0x9C40,0x9CFF,
  1438. 0x9D40,0x9DFF,
  1439. 0x9E40,0x9EFF,
  1440. 0x9F40,0x9FFF,
  1441.  
  1442. 0xE040,0xE0FF,
  1443. 0xE140,0xE1FF,
  1444. 0xE240,0xE2FF,
  1445. 0xE340,0xE3FF,
  1446. 0xE440,0xE4FF,
  1447. 0xE540,0xE5FF,
  1448. 0xE640,0xE6FF,
  1449. 0xE740,0xE7FF,
  1450. 0xE840,0xE8FF,
  1451. 0xE940,0xE9FF,
  1452.  
  1453. 0xEA40,0xEAFF,
  1454. 0xEB40,0xEBFF,
  1455. 0xEC40,0xECFF,
  1456. 0xED40,0xEDFF,
  1457. 0xEE40,0xEEFF,
  1458. 0xEF40,0xEFFF,
  1459. 0xF020,0xF1FF,
  1460. 0xF220,0xF3FF,
  1461. 0xF420,0xF4FF,
  1462. 0xF520,0xF5FF};
  1463.  
  1464.  
  1465. /* code が bn 番目のブロックに入っていたらOK(bn を返す) */
  1466. /* さもなくば正しいブロックを返す */
  1467. /* そして、begin_kigou を強制的に書き換える */
  1468. int
  1469. xf_kigou_check(UINT code, int bn)
  1470. {
  1471.     int flag;
  1472.  
  1473.     if ((block_top[bn][0] <= code) && (code <= block_top[bn][1])) {
  1474.         return(bn);
  1475.     } else {
  1476.         if (code < block_top[bn][0]) {    /* 下へずれた */
  1477.             flag = 1;
  1478.             if (bn) {
  1479.                 bn--;
  1480.             } else {
  1481.                 bn = kigou_max_block-1;
  1482.             }
  1483.         } else {            /* 上へずれた */
  1484.             flag = 0;
  1485.             if (bn != (kigou_max_block-1)) {
  1486.                 bn++;
  1487.             } else {
  1488.                 bn = 0;
  1489.             }
  1490.         }
  1491.         if (bn != 5) {
  1492.             kigou_begin = (block_top[bn][flag] & 0xfff0) + (code & 0x000f);
  1493.         } else {
  1494.             kigou_begin = 0x889f;
  1495.         }
  1496.         return(bn);
  1497.     }
  1498. }
  1499.  
  1500. /* code が何番目のブロックかを返す */
  1501. int
  1502. xf_kigou_block_number(UINT code)
  1503. {
  1504.     register int i;
  1505.  
  1506.     for(i=0;i<kigou_max_block;i++) {
  1507.         if ((block_top[i][0] <= code) && (code <= block_top[i][1])) {
  1508.             return(i);
  1509.         }
  1510.     }
  1511.     error("おかしなコードです");
  1512.     return(-1);
  1513. }
  1514.  
  1515. int kigou_new_flag;
  1516.  
  1517. /* 記号入力 */
  1518. UINT
  1519. xf_kigou()
  1520. {
  1521.     UINT c;
  1522.     int blockn;
  1523.  
  1524.     if ((!kigou_new_flag) && (FP_MODE[3] == 'H')) {    /* 変換モードであった */
  1525.         xf_ikinari_kakutei();
  1526.         strcpy(FP_MODE_HEN,FP_MODE);
  1527.         strcpy(FP_MODE,FP_MODE_MUHEN);
  1528.         kigou_new_flag = 1;
  1529.     }
  1530.  
  1531.     disp_hmode();        /* 一番下の行に変換モード表示を行う */
  1532.     fep_follow_led();
  1533.  
  1534.     kigou_or_code = 0;
  1535.     blockn = xf_kigou_block_number(kigou_begin);
  1536.     disp_kigou_koho();    /* 取敢えず16個表示 */
  1537.     while(1) {
  1538.         if (UNDER_FLAG) {
  1539.             fep_input_flush();    /* カーソルをちゃんと戻す */
  1540.         } else {
  1541.             work_cursor_cpx();
  1542.         }
  1543.         etc_while_fep_qxf();    /* 離されるまで待つ */
  1544. /*        fep_key_clear();*/
  1545.         c = toupper(fep_inkey_raw());
  1546.         fep_key_clear();
  1547.  
  1548.         if (c == XF_RIGHT_KOHO_KEY) {        /* 年上のコードへ */
  1549.             blockn = xf_kigou_check(++kigou_begin,blockn);
  1550.             disp_kigou_koho();
  1551.         } else if (c == XF_LEFT_KOHO_KEY) {    /* 若いコードへ */
  1552.             blockn = xf_kigou_check(--kigou_begin,blockn);
  1553.             disp_kigou_koho();
  1554.         } else if (c == XF_BEFORE_BLOCK_KEY) {    /* 若いブロックへ */
  1555.             kigou_begin = (kigou_begin-0x10) & 0xfff0;
  1556.             blockn = xf_kigou_check(kigou_begin,blockn);
  1557.             disp_kigou_koho();
  1558.         } else if (c == XF_NEXT_BLOCK_KEY) {    /* 年上のブロックへ */
  1559.             kigou_begin = (kigou_begin+0x10) & 0xfff0;
  1560.             blockn = xf_kigou_check(kigou_begin,blockn);
  1561.             disp_kigou_koho();
  1562.         } else if (c == XF_NEXT_PAGE_KEY) {    /* 次のブロックの先頭へ */
  1563.             if (blockn == 5) {
  1564.                 blockn = 7;
  1565.             } else {
  1566.                 blockn++;
  1567.             }
  1568.             if (blockn >= kigou_max_block) {
  1569.                 blockn = 0;
  1570.             }
  1571.             kigou_begin = block_top[blockn][0];            
  1572.             disp_kigou_koho();
  1573.         } else if (c == XF_BEFORE_PAGE_KEY) {
  1574.             /* 今のブロックの先頭へ、先頭だったら前のブロックの先頭へ */
  1575.             if (kigou_begin == block_top[blockn][0]) {    /* 先頭だった */
  1576.                 if (blockn == 7) {
  1577.                     blockn = 5;
  1578.                 } else {
  1579.                     blockn--;
  1580.                 }
  1581.                 if (blockn < 0) {
  1582.                     blockn = kigou_max_block-1;
  1583.                 }
  1584.             } else {    /* 先頭ではなかった */
  1585.                 if (blockn == 6) {
  1586.                     blockn = 5;
  1587.                 }
  1588.             }
  1589.             kigou_begin = block_top[blockn][0];
  1590.             disp_kigou_koho();
  1591.         } else if (c == ('M'-'@')) {
  1592.             UINT cn;
  1593.  
  1594.             cn = etc_normal_jis(kigou_begin);
  1595.             kigou_or_code = 1;
  1596.             return(cn);
  1597.         } else if ((c == 0x108) || (c == '['-'@')) {    /* 記号入力 */
  1598.             etc_func_on();
  1599.             etc_while_fep_qxf();    /* 離されるまで待つ */
  1600.             kigou_or_code = 0;
  1601.  
  1602.             if (kigou_new_flag) {
  1603.                 strcpy(FP_MODE_MUHEN,FP_MODE);/* ,,, */
  1604.                 strcpy(FP_MODE,FP_MODE_HEN);
  1605.             }
  1606.             disp_hmode();        /* 一番下の行に変換モード表示を行う */
  1607.             fep_follow_led();
  1608.             kigou_new_flag = 0;
  1609.             if (UNDER_FLAG) {
  1610.                 fep_input_flush();    /* カーソルをちゃんと戻す */
  1611.             } else {
  1612.                 work_cursor_cpx();
  1613.             }
  1614.             return(0);
  1615.         }
  1616.     }
  1617. }
  1618.  
  1619. #define MAIN_DIC    0
  1620. #define SUB_DIC        1
  1621.  
  1622. /* 辞書登録 */
  1623. void
  1624. xf_touroku()
  1625. {
  1626.     int f,c;
  1627.     STR p;
  1628.     int main_or_sub,hinshi;
  1629.     UBYTE yomi[MAXLINE],mojiretu[MAXLINE];
  1630.     UBYTE w[MAXLINE];
  1631.     UNIT *wp;
  1632.  
  1633.     xf_ikinari_kakutei();
  1634.     etc_while_fep_qxf();
  1635.     c = work_make_cut_buff0_list((STR)NULL,(STR)"",(STR)"");
  1636.     /* -1 = 空、さもなくば、CUT_BUFF の総バイト長を返す */
  1637.     if (c <= 0) {
  1638.         under_print((STR)"カットバッファの中に登録する文字列を入れておいて下さい[中断]");
  1639.         return;
  1640.     }
  1641.     if (c > 32) {
  1642.         under_print((STR)"登録しようとする文字列が長すぎます[中断]");
  1643.         return;
  1644.     }
  1645.     wp = work_get_from_cut_buff0_list();    /* 一行持って来る */
  1646.     line_get_body(mojiretu,wp);
  1647.     if (!etc_remove_cr_tab(mojiretu)) {
  1648.         under_print((STR)"登録できません[中断]");
  1649.         return;
  1650.     }
  1651.  
  1652.     sprintf((char *) w,"[%s] を辞書に登録します。読みを入力して下さい:",mojiretu);
  1653.     c = FP_MODE[3];
  1654.     fep_hmode_set('M');    /* 一時的に無変換にする */
  1655.     if (under_input_cr(w,yomi) < 0) {    /* 無効であった = ^G */
  1656.         under_print((STR)"[中断]");
  1657.         fep_hmode_set(c);    /* 戻す */
  1658.         return;
  1659.     }
  1660.     fep_hmode_set(c);    /* 戻す */
  1661.  
  1662.     hinshi = xf_get_hinshi();
  1663.     if ((hinshi < 1) || (hinshi > 30)) {    /* 品詞コードではない */
  1664.         under_print((STR)"[中断]");
  1665.         return;
  1666.     }
  1667.     f = under_input_cr_raw((STR)"メイン辞書(=0)ですか、それともサブ辞書(=1)ですか?(中止=ESC):",w);
  1668.     main_or_sub = atoi((char *) w);
  1669.     if (((*w != '0') && (*w != '1')) || (f < 0) || (main_or_sub < 0) || (main_or_sub > 1)) {
  1670.         under_print((STR)"[中断]");
  1671.         return;
  1672.     }
  1673.     {
  1674.         int mode;
  1675.  
  1676.         mode = KNJCTRL(8);
  1677.         KNJCTRL(7,0);    /* lock */
  1678.         f = KNJCTRL(30,main_or_sub,yomi,mojiretu,hinshi);
  1679.         KNJCTRL(7,mode);
  1680.     }
  1681.     if (f) {
  1682.         switch(f) {
  1683.         case 1:
  1684.             p = (STR)"辞書の種類が不適当です";
  1685.             break;
  1686.         case 2:
  1687.             p = (STR)"文法コード(品詞)が不適当です";
  1688.             break;
  1689.         case 3:
  1690.             p = (STR)"読みが不適当です";
  1691.             break;
  1692.         case 4:
  1693.             p = (STR)"登録するページがありません";
  1694.             break;
  1695.         }
  1696.         etc_beep();
  1697.     } else {
  1698.         if (main_or_sub) {
  1699.             p = (STR)"サブ辞書に登録しました";
  1700.         } else {
  1701.             p = (STR)"メイン辞書に登録しました";
  1702.         }
  1703.     }
  1704.     under_print(p);
  1705.     etc_while_fep_qxf();    /* 離されるまで待つ */
  1706. }
  1707.  
  1708. /* 辞書削除 */
  1709. void
  1710. xf_sakujyo()
  1711. {
  1712.     int f,c;
  1713.     STR p;
  1714.     int main_or_sub,hinshi;
  1715.     UBYTE yomi[MAXLINE],mojiretu[MAXLINE];
  1716.     UBYTE w[MAXLINE];
  1717.     UNIT *wp;
  1718.  
  1719.     xf_ikinari_kakutei();
  1720.     etc_while_fep_qxf();
  1721.     c = work_make_cut_buff0_list((STR)NULL,(STR)"",(STR)"");
  1722.     /* -1 = 空、さもなくば、CUT_BUFF の総バイト長を返す */
  1723.     if (c <= 0) {
  1724.         under_print((STR)"カットバッファの中に辞書から削除する文字列を入れておいて下さい[中断]");
  1725.         return;
  1726.     }
  1727.     if (c > 32) {
  1728.         under_print((STR)"削除しようとする文字列が長すぎます[中断]");
  1729.         return;
  1730.     }
  1731.     wp = work_get_from_cut_buff0_list();    /* 一行持って来る */
  1732.     line_get_body(mojiretu,wp);
  1733.     if (!etc_remove_cr_tab(mojiretu)) {
  1734.         under_print((STR)"登録できません[中断]");
  1735.         return;
  1736.     }
  1737.  
  1738.     c = FP_MODE[3];
  1739.     fep_hmode_set('M');    /* 一時的に無変換にする */
  1740.     sprintf((char *) w,"[%s] を辞書から削除します。読みを入力して下さい:",mojiretu);
  1741.     if (under_input_cr(w,yomi) < 0) {    /* 無効であった = ^G */
  1742.         under_print((STR)"[中断]");
  1743.         fep_hmode_set(c);    /* 戻す */
  1744.         return;
  1745.     }
  1746.     fep_hmode_set(c);    /* 戻す */
  1747.  
  1748.     hinshi = xf_get_hinshi();
  1749.     if ((hinshi < 1) || (hinshi > 30)) {    /* 品詞コードではない */
  1750.         under_print((STR)"[中断]");
  1751.         return;
  1752.     }
  1753.     f = under_input_cr_raw((STR)"メイン辞書(=0)ですか、それともサブ辞書(=1)ですか?(中止=ESC):",w);
  1754.     main_or_sub = atoi((char *) w);
  1755.     if (((*w != '0') && (*w != '1')) || (f < 0) || (main_or_sub < 0) || (main_or_sub > 1)) {
  1756.         under_print((STR)"[中断]");
  1757.         return;
  1758.     }
  1759.  
  1760.     {
  1761.         int mode;
  1762.  
  1763.         mode = KNJCTRL(8);
  1764.         KNJCTRL(7,0);    /* lock */
  1765.         f = KNJCTRL(31,main_or_sub,yomi,mojiretu,hinshi);
  1766.         KNJCTRL(7,mode);
  1767.     }
  1768.     if (f) {
  1769.         switch(f) {
  1770.         case -1:
  1771.             p = (STR)"削除する単語が見つかりません";
  1772.             break;
  1773.         case 1:
  1774.             p = (STR)"辞書の種類が不適当です";
  1775.             break;
  1776.         case 2:
  1777.             p = (STR)"文法コード(品詞)が不適当です";
  1778.             break;
  1779.         case 3:
  1780.             p = (STR)"読みが不適当です";
  1781.             break;
  1782.         case 4:
  1783.             p = (STR)"辞書が見つかりません";
  1784.             break;
  1785.         }
  1786.         etc_beep();
  1787.     } else {
  1788.         p = (STR)"単語を削除しました";
  1789.     }
  1790.     under_print(p);
  1791.     etc_while_fep_qxf();    /* 離されるまで待つ */
  1792. }
  1793.  
  1794. #if 0
  1795. void
  1796. xf_dic_report()
  1797. {
  1798.     UBYTE w[MAXLINE],maindic[MAXLINE],subdic[MAXLINE];
  1799.  
  1800.     KNJCTRL(41,maindic,subdic);
  1801.     strcpy(w,"メイン:");
  1802.     strcat(w,maindic);
  1803.     strcat(w,", サブ:");
  1804.     strcat(w,subdic);
  1805.     under_print(w);
  1806. }
  1807. #endif
  1808.  
  1809. void
  1810. xf_dic_learn_mode()
  1811. {
  1812.     int mode;
  1813.  
  1814.     if (mode = KNJCTRL(12)) {    /* 学習モードを得る */
  1815.         under_print((STR)"[ディスク学習をメモリ学習に変更しました]");
  1816.     } else {
  1817.         under_print((STR)"[メモリ学習をディスク学習に変更しました]");
  1818.     }
  1819.     KNJCTRL(11,!mode);
  1820. }
  1821.  
  1822. STR hinshi_mess[31][2] = {
  1823. (STR)"カーソルキーで上下して、品詞を選んで下さい。<NL> で確定です",    (STR)"(中断)",
  1824. (STR)"動詞カ行五段活用",    (STR)"聞-く",
  1825. (STR)"動詞ガ行五段活用",    (STR)"泳-ぐ",
  1826. (STR)"動詞サ行五段活用",    (STR)"話-す",
  1827. (STR)"動詞タ行五段活用",    (STR)"勝-つ",
  1828. (STR)"動詞ナ行五段活用",    (STR)"死-ぬ",
  1829. (STR)"動詞バ行五段活用",    (STR)"飛-ぶ",
  1830. (STR)"動詞マ行五段活用",    (STR)"読-む",
  1831. (STR)"動詞ラ行五段活用",    (STR)"切-る",
  1832. (STR)"動詞ワ行五段活用",    (STR)"使-う",
  1833. (STR)"動詞サ行変格活用",    (STR)"する",
  1834. (STR)"動詞カ行変格活用",    (STR)"来る",
  1835. (STR)"動詞一段活用",        (STR)"見-る 教え-る(上一段活用、下一段活用)",
  1836. (STR)"形容詞",            (STR)"新し-い 良-い(ク活用とシク活用は区別しない)",
  1837. (STR)"形容動詞",        (STR)"静か-だ",
  1838. (STR)"形容動詞複合名詞",    (STR)"純粋(な人)のように形容動詞としても使う名詞",
  1839. (STR)"サ変複合名詞",        (STR)"愛(する)、惨敗(する)のようにサ変複合動詞になる名詞",
  1840. (STR)"名詞",            (STR)"形容動詞の語幹やサ変複合動詞にならない名詞",
  1841. (STR)"単漢字",            (STR)"漢字の読みの登録",
  1842. (STR)"人名(姓)",        (STR)"人名の姓",
  1843. (STR)"人名(名)",        (STR)"人名の名",
  1844. (STR)"地名",            (STR)"地名",
  1845. (STR)"団体名",            (STR)"会社名、法人名、政党名など",
  1846. (STR)"物の名称",        (STR)"商品名など",
  1847. (STR)"数詞",            (STR)"個、匹など",
  1848. (STR)"数字",            (STR)"数字",
  1849. (STR)"接尾語",            (STR)"語の下につける語(さ、さん、めく、ぽい、がる など)",
  1850. (STR)"感動詞",            (STR)"感動や呼びかけ、話の受け答え(おや、まあ、はい など)",
  1851. (STR)"接続詞",            (STR)"前の言葉と後の言葉をつなぐ語(または、そこで など)",
  1852. (STR)"副詞",            (STR)"活用語を修飾する語(はっきり、たいへん、実に など)",
  1853. (STR)"連体詞",            (STR)"非活用語を修飾する語(たった、あらゆる、あの など)"
  1854. };
  1855.  
  1856. int
  1857. xf_get_hinshi()
  1858. {
  1859.     UBYTE w[MAXLINE];
  1860.     int h;
  1861.     UINT c;
  1862.  
  1863.     h = touroku_hinshi;
  1864.     while(1) {
  1865.         sprintf((char *)w,"%-16s ↑[%2d] ↓例:%s",hinshi_mess[h][0],h,hinshi_mess[h][1]);
  1866.         under_print(w);
  1867.         if (h) {
  1868.             window_abs_loc(21,UNDER_Y);
  1869.         } else {
  1870.             window_abs_loc(67,UNDER_Y);
  1871.         }
  1872.         c = fep_inkey_raw();
  1873.         if ((c == 'M'-'@') || (c == 'J'-'@')) {
  1874.             touroku_hinshi = h;
  1875.             return(h);
  1876.         }
  1877.         if (c == '['-'@') {
  1878.             return(0);
  1879.         }
  1880.         if (c == XF_BEFORE_BLOCK_KEY) {        /* 下向き矢印 */
  1881.             if (--h < 0) {
  1882.                 h = 30;
  1883.             }
  1884.         } else if (c == XF_NEXT_BLOCK_KEY) {    /* 上向き矢印 */
  1885.             if (++h > 30) {
  1886.                 h = 0;
  1887.             }
  1888.         }
  1889.     }
  1890. }
  1891.  
  1892. /* 辞書の学習をフラッシュする */
  1893. void
  1894. xf_dic_flush()
  1895. {
  1896.     KNJCTRL(29);
  1897. }
  1898.  
  1899. int
  1900. xf_append_tb_r(UINT c)
  1901. {
  1902.     if (c < 0x100) {
  1903.         TBUFF_R[TBUFFC_R++] = c;
  1904.     } else {
  1905.         TBUFF_R[TBUFFC_R++] = (c >> 8) & 0xff;
  1906.         TBUFF_R[TBUFFC_R++] = c & 0xff;
  1907.     }
  1908.     TBUFF_R[TBUFFC_R] = EOS;
  1909. /*printf("[%x:%x:%x]",TBUFF_R[0],TBUFF_R[1],TBUFF_R[2]);getchar();*/
  1910.     xf_disp_insert(&TX,&TY);
  1911.     work_cursor_cpx();
  1912.     return(0);
  1913. }
  1914.  
  1915. void
  1916. xf_init_tb_r0()
  1917. {
  1918.     UWORD l;
  1919.  
  1920.     if (DUM_FLAG) {
  1921.         return;
  1922.     }
  1923.  
  1924.     l = etc_jlast(TBUFF);
  1925. /*    if (l == L'っ') {
  1926.         return;
  1927.     }
  1928. */
  1929. /*    if ((l == L'ん') && !(strstr("KSTNHMYRWGZJDBVP",TBUFF_R))) {*/
  1930. /*    if ((l == L'ん') && !(strstr("KCSTNHMFYRLWGZJDBVP",TBUFF_R))) {*/
  1931.     if ((l == L'ん') && (strstr("AEIOU",TBUFF_R))) {
  1932.         TBUFFC_R = 0;
  1933.         *TBUFF_R = EOS;
  1934.         B_BPOKE(fep_p1,0);
  1935.         B_BPOKE(fep_p2,0);
  1936.         fep_p2_last = B_BPEEK(fep_p2);
  1937.     }
  1938. }
  1939.  
  1940. void
  1941. xf_init_tb_r00()
  1942. {
  1943.     B_BPOKE(fep_p1,0);
  1944.     B_BPOKE(fep_p2,0);
  1945. }
  1946.  
  1947. /* r == "N" なら 'ん' にする */
  1948. /* r を d に cat する */
  1949. /* xf_init_tb_r() を呼ぶ */
  1950. void
  1951. xf_cat_r_init(UBYTE *d,UBYTE *r)
  1952. {
  1953.     if (!jstrcmp(r,"N") || !jstrcmp(r,"n")) {
  1954.         strcpy(r,"ん");
  1955.     } else if (!strcmp(r,"N") || !strcmp(r,"n")) {
  1956.         strcpy(r,"ン");
  1957.     }
  1958.     strcat(d,r);
  1959.     xf_init_tb_r();
  1960. }
  1961.  
  1962. void
  1963. xf_init_tb_r()
  1964. {
  1965. /*
  1966. window0();
  1967. printf("(%d)(%s)",TBUFFC_R,TBUFF_R);
  1968. binkey();
  1969. */
  1970.     if (!DUM_FLAG) {
  1971.         B_BPOKE(fep_p1,0);
  1972.         B_BPOKE(fep_p2,0);
  1973.         fep_p2_last = B_BPEEK(fep_p2);
  1974.     }
  1975.     if (TBUFFC_R) {
  1976.         TBUFFC_R = 0;
  1977.         *TBUFF_R = EOS;
  1978. /*        xf_disp_insert(&TX,&TY);*/
  1979.         xf_check(0x1ff);
  1980.     }
  1981. }
  1982.  
  1983. void
  1984. xf_tb_r_follow()
  1985. {
  1986.     register int i,c1,c2;
  1987.     register UINT c;
  1988.  
  1989.     if (DUM_FLAG) {
  1990.         return;
  1991.     }
  1992.     if (((VERSION < 300) && ((c1 = B_BPEEK(fep_p1)) == (c2 = B_BPEEK(fep_p2)))) ||
  1993.         ((VERSION >= 300) && !(c1 = B_BPEEK(fep_p1)))) {
  1994.         xf_init_tb_r();
  1995. /*        xf_disp_insert(&TX,&TY);*/
  1996.     } else {
  1997.         if ((!TBUFFC_R) && (!TBUFFC)) {        /* 未確定入力開始 */
  1998.             TTOPL00 = line_my_top();
  1999.             TL00 = TL1 = TL0 = CL;    /* 変換バッファの開始行 */
  2000.             CRX = CRY = 0;
  2001.             TPX00 = TPX0 = CPX;
  2002.             TX00 = TX = TX0 = CX;
  2003.             TY00 = TY = TY0 = CY;
  2004.             TBP1 = TBP00 = TBP0 = ANALYZE[CPX].BPOS;
  2005.         }
  2006.         TBUFFC_R = 0;
  2007.         if (VERSION < 300) {
  2008.             i = c1;
  2009.         } else {
  2010.             i = 1;
  2011.             TBUFFC_R = 0;
  2012.             *TBUFF_R = EOS;
  2013.         }
  2014.         while(1) {
  2015.             if (VERSION < 300) {
  2016.                 c = B_BPEEK(fep_pr+i);
  2017.             } else {
  2018.                 c = B_BPEEK(fep_pr+i*2);
  2019.             }
  2020.             if (!isalpha(c)) {
  2021.                 break;
  2022.             }
  2023.  
  2024. #if 1
  2025.     if ((!TBUFFC_R) && (VERSION >= 300) && (fep_shift_ctrl() == 0x10)
  2026.     &&  ((FP_MODE[1] == 'K') || (FP_MODE[2] == 'R'))
  2027.     && (FP_MODE[0] == 'Z') && (toupper(c) == 'Z')) {
  2028.         B_BPOKE(fep_p1,B_BPEEK(fep_p1)-1);
  2029.         B_BPOKE(fep_p1+i*2,0);
  2030.         strcat(TBUFF,TBUFF_R);
  2031.         *TBUFF_R = EOS;
  2032.         TBUFFC_R = 0;
  2033. /*        xf_disp_insert(&TX,&TY);*/
  2034.         fep_push_key(L'っ');
  2035.         break;
  2036. /*
  2037.         TBUFF_R[TBUFFC_R++] = (c >> 8) & 0xff;
  2038.         TBUFF_R[TBUFFC_R++] = c & 0xff;
  2039.         xf_cat_r_init(TBUFF,TBUFF_R);
  2040. */
  2041.     } else {
  2042.             if (FP_MODE[0] == 'Z') {    /* 全角モード */
  2043.                 c = hantozen(c);
  2044.             }
  2045.     }
  2046. #endif
  2047. #if 0
  2048.             if (FP_MODE[0] == 'Z') {    /* 全角モード */
  2049.                 c = hantozen(c);
  2050.             }
  2051. #endif
  2052.             if (c & 0xff00) {
  2053.                 TBUFF_R[TBUFFC_R++] = (c >> 8) & 0xff;
  2054.                 TBUFF_R[TBUFFC_R++] = c & 0xff;
  2055.             } else {
  2056.                 TBUFF_R[TBUFFC_R++] = c;
  2057.             }
  2058.             if ((VERSION >= 300) && (i >= B_BPEEK(fep_p1))) {
  2059.                 break;
  2060.             }
  2061.             i++;
  2062.             if ( i > 9) i = 0;
  2063.             if ((VERSION < 300) && (i == c2)) {
  2064.                 break;
  2065.             }
  2066.         }
  2067.         TBUFF_R[TBUFFC_R] = EOS;
  2068.     }
  2069. }
  2070.  
  2071. void
  2072. xf_flush_tb_r()
  2073. {
  2074.     if ((TBCP+TBUFFC_R) < 80) {
  2075.         TBCP += TBUFFC_R;
  2076.         TBUFFC += TBUFFC_R;
  2077.         xf_cat_r_init(TBUFF,TBUFF_R);
  2078.     }
  2079.     xf_init_tb_r();
  2080. }
  2081.  
  2082. void
  2083. xf_flush_tb_r_under()
  2084. {
  2085. /*    strcat(right,TBUFF_R);*/
  2086.     rightc += TBUFFC_R;
  2087.     xf_cat_r_init(right,TBUFF_R);
  2088. /*    xf_init_tb_r();*/
  2089. }
  2090.  
  2091. void
  2092. xf_disp_tb_r_under()
  2093. {
  2094.     etc_color(MIZU_EMPH_REV);
  2095.     B_PRINT(TBUFF_R);
  2096.     etc_color(NORMAL);
  2097. }
  2098.  
  2099. void
  2100. xf_rubi(STR s)
  2101. {
  2102.     UINT c,c0;
  2103.     register STR d;
  2104.     UBYTE w[VERY_LONG_LINE];
  2105.  
  2106.  
  2107. /*    work_replace_str_echo(TL0,TBP0,TL1,TBP1,"",0,TY0);*/
  2108.  
  2109.     d = w;
  2110.     while(s = etc_jfirst_x(s,&c)) {
  2111.         if (c < 0x100) {
  2112.             if (c == ' ') {    /* 半角スペースは CENTER がらみで特別に許可 */
  2113.                 *d++ = (UBYTE)c;
  2114.             }
  2115.             continue;
  2116.         }
  2117.         c0 = zentohan(c);
  2118.         if (c0 == c) {                /* 変換されなかった */
  2119.             continue;
  2120.         } else {                /* 変換された */
  2121.             UBYTE up_code;
  2122.  
  2123.             if (jishira(c)) {        /* 全角ひらがなである */
  2124.                 up_code = 0xf1;
  2125.             } else {
  2126.                 up_code = 0xf0;
  2127.             }
  2128.             *d++ = (UBYTE) up_code;
  2129.             *d++ = (UBYTE) c0;    /* 下位バイト */
  2130.             if (c0 & 0xff00) {    /* 2バイトだ(濁点、半濁点がある) */
  2131.                 *d++ = (UBYTE) up_code;
  2132.                 *d++ = (UBYTE)(c0 >> 8);    /* ?点 */
  2133.             }
  2134.         }
  2135.     }
  2136.  
  2137.     *d = EOS;
  2138.     /* w[] にルビが入っている */
  2139.     if (*w) {
  2140.         line_seigyou();
  2141.         change_check();
  2142.         if (!LYW_UPPER && (!CWY0 && (CWY1 == UNDER_Y-2))) {
  2143.             ctrl_t_u();
  2144.         }
  2145.         etc_trim_tail();
  2146.  
  2147.         if (!line_length(CL) && (CL->ATO == TAIL)) {
  2148.             return;
  2149.         }
  2150.         xf_set_rubi(CL,ANALYZE[CPX].BPOS,w);
  2151.     }
  2152. }
  2153.  
  2154. /* p1 ユニットの b1 から rdata をルビとして埋め込んでいく */
  2155. void
  2156. xf_set_rubi(UNIT *p1,int b1,STR rdata)
  2157. {
  2158.     while((rdata = xf_set_rubi1(p1,b1,rdata)) && (p1 != TAIL)) {    /* まだ rdata が残っている */
  2159.         p1 = p1->ATO;
  2160.         b1 = 0;
  2161.     }
  2162.     line_cl_cl();
  2163.     work_line_analyze();
  2164.     work_cursor_cpx();
  2165. }
  2166.  
  2167. /* p1 の b1 から rdata をルビとして挿入する */
  2168. /* rdata が残ったら、残ったアドレスを返す */
  2169. /* 残らなかったら NULL を返す */
  2170. STR
  2171. xf_set_rubi1(UNIT *p1,int b1,STR rdata)
  2172. {
  2173.     UBYTE l[VERY_LONG_LINE],s[VERY_LONG_LINE];
  2174.     register int count,bc,bc0,b2;
  2175.     int dummy;
  2176.     register UBYTE *p;
  2177.     UINT code1,code2,code3;
  2178.  
  2179.     line_get_body(l,p1);
  2180.     count = bc = b1;
  2181.     b2 = strlen(l);
  2182.     strncpy(s,l,count);
  2183.  
  2184.     while((bc < b2) && rdata && (*rdata)) {
  2185.         /* p[bc] から始めて、次の文字までのバイト数を返す */
  2186.         /* *xc から表示しているとして、*xc を更新する */
  2187.         bc0 = bc;
  2188.         p = line_skip_xcode(&l[bc]);
  2189.         bc = p - l;
  2190.         p = string_search_xcode(&l[bc0]);
  2191.                     /* 最初の XCODE の位置:実体を通り過ぎるかもしれない */
  2192.         while(1) {
  2193.             code3 = code1 = etc_jfirst(&l[bc]);
  2194.             if (!code1 || (code1 == CR)) {
  2195.                     /* 実体をチェック、改行や EOS にルビは付かない */
  2196.                 break;
  2197.             }
  2198.  
  2199.             if ((!p) || ((UINT)p >= (UINT)&l[bc])) {
  2200.                         /* この行にはもう XCODE が無い or もっと先 */
  2201.                 /* 素直に納める */
  2202.                 s[count++] = XCODE_UP;
  2203.                 if (etc_char_disp_len(code1) == 1) {    /* 表示幅チェック */
  2204.                     /* 半角文字である */
  2205.                     s[count++] = XCODE_RB1;
  2206.                     rdata = etc_jfirst_x(rdata,&code1);
  2207.                     if (code1 && (code1 != 0xf020)) {
  2208.                         s[count++] = (code1 >> 8);
  2209.                         s[count++] = code1 & 0xff;
  2210.                     } else {
  2211.                         count -= 2;
  2212.                     }
  2213.                 } else {
  2214.                     rdata = etc_jfirst_x(rdata,&code1);
  2215.                     if (code1 == ' ') {    /* 半角スペースなので CENTER */
  2216.                         rdata = etc_jfirst_x(rdata,&code2);
  2217.                         if (code2) {
  2218.                             s[count++] = XCODE_RB10;
  2219.                             s[count++] = (code2 >> 8);
  2220.                             s[count++] = code2 & 0xff;
  2221.                         }
  2222.                     } else {
  2223.                         rdata = etc_jfirst_x(rdata,&code2);
  2224.                         if (code1 == 0xf020) {    /* 右肩か無しか */
  2225.                             if ((code2) && (code2 != 0xf020)) {    /* 右肩 */
  2226.                                 s[count++] = XCODE_RB1R;
  2227.                                 s[count++] = (code2 >> 8);
  2228.                                 s[count++] = code2 & 0xff;
  2229.                             } else {    /* 無し */
  2230.                                 count--;
  2231.                             }
  2232.                         } else if ((!code2) || (code2 == 0xf020)) {
  2233.                                 /* 左肩 */
  2234.                             s[count++] = XCODE_RB1L;
  2235.                             s[count++] = (code1 >> 8);
  2236.                             s[count++] = code1 & 0xff;
  2237.                         } else {    /* 両肩 */
  2238.                             s[count++] = XCODE_RB2;
  2239.                             s[count++] = (code1 >> 8);
  2240.                             s[count++] = code1 & 0xff;
  2241.                             s[count++] = (code2 >> 8);
  2242.                             s[count++] = code2 & 0xff;
  2243.                         }
  2244.                     }
  2245.                 }
  2246.                 break;
  2247.             } else {
  2248.                 code2 = *(++p);
  2249.                 if (code2 == XCODE_RB10) {    /* 予約:1文字真ん中ルビ */
  2250.                     p += 2;
  2251.                     break;
  2252.                 } else if (code2 == XCODE_RB1) {    /* 1文字ルビ(半角用) */
  2253.                     p += 2;
  2254.                     break;
  2255.                 } else if (code2 == XCODE_RB1L) {    /* 1文字ルビ左(全角用) */
  2256.                     p += 2;
  2257.                     break;
  2258.                 } else if (code2 == XCODE_RB1R) {    /* 1文字ルビ右(全角用) */
  2259.                     p += 2;
  2260.                     break;
  2261.                 } else if (code2 == XCODE_RB2) {    /* 2文字ルビ(全角用) */
  2262.                     p += 4;
  2263.                     break;
  2264.                 }
  2265.                 /* ルビではなかった */
  2266.                 p = string_search_xcode(p);    /* 次の XCODE の位置 */
  2267.             }
  2268.         }
  2269.         strncpy(&s[count],&l[bc0],bc-bc0);    /* XCODE を追加しておく */
  2270.         count += bc-bc0;
  2271.         if (code3 & 0xff00) {
  2272.             s[count++] = code3 >> 8;
  2273.             s[count++] = code3 & 0xff;
  2274.             bc += 2;
  2275.         } else {
  2276.             s[count++] = code3;
  2277.             bc++;
  2278.         }
  2279.     }
  2280.  
  2281.     if (l[bc]) {
  2282.         int ll;
  2283.  
  2284.         ll = strlen(&l[bc]);
  2285.         strncpy(&s[count],&l[bc],ll);    /* 後ろに接続する */
  2286.         s[count+ll] = EOS;
  2287.     } else {
  2288.         s[count] = EOS;
  2289.     }
  2290.     if (strlen(s)) {
  2291.         line_store_and_echo(p1,s);    /* 格納する */
  2292.     }
  2293.     return(rdata);
  2294. }
  2295.  
  2296.  
  2297. void
  2298. xf_do_121()
  2299. {
  2300.     if (FP_MODE[3] == 'H') {    /* 変換モードであった */
  2301.         xf_ikinari_kakutei();
  2302.     }
  2303.     if (CXF1_FLAG) {
  2304.         strcpy(FP_MODE_HEN,FP_MODE);
  2305.         strcpy(FP_MODE,FP_MODE_MUHEN);
  2306.     } else {
  2307.         strcpy(FP_MODE_MUHEN,FP_MODE);
  2308.         strcpy(FP_MODE,FP_MODE_HEN);
  2309.     }
  2310.     CXF1_FLAG = !CXF1_FLAG;
  2311.     disp_hmode();        /* 一番下の行に変換モード表示を行う */
  2312.     fep_follow_led();
  2313.     etc_while_fep_qxf();    /* 離されるまで待つ */
  2314. }
  2315.  
  2316. UBYTE FP_MODE_MUHEN0[16];
  2317. UBYTE FP_MODE_HEN0[16];
  2318.  
  2319. UWORD CXF1_FLAG0;
  2320.  
  2321. void
  2322. xf_push_cxf1()
  2323. {
  2324.     strcpy(FP_MODE_MUHEN0,FP_MODE_MUHEN);
  2325.     strcpy(FP_MODE_HEN0,FP_MODE_HEN);
  2326.  
  2327.     CXF1_FLAG0 = CXF1_FLAG;
  2328. }
  2329.  
  2330. void
  2331. xf_pop_cxf1()
  2332. {
  2333.     strcpy(FP_MODE_MUHEN,FP_MODE_MUHEN0);
  2334.     strcpy(FP_MODE_HEN,FP_MODE_HEN0);
  2335.  
  2336.     CXF1_FLAG = CXF1_FLAG0;
  2337. }
  2338.  
  2339.  
  2340.